<?php
defined('BASEPATH') OR exit('No direct script access allowed');

/**
 * 建立一个原生的 swoole_websocket_server
 * 如果用 swoole framework 创建项目则无需使用该函数
 *
 * @return object
 */
function websocket_server_open()
{
    static $server;
    if (!is_cli()) {
        $CI = get_instance();
        $data = array(
            'heading' => '运行出错',
            'message' => '<p>请使用 PHP-CLI 模式运行</p>',
        );
        $CI->load->view('errors/html/error_general', $data);
        exit($CI->output->get_output());
    }
    if (empty($server)) {
        $config = config_item('websocket_server');
        $server = new swoole_websocket_server($config['host'], $config['port'], SWOOLE_BASE);
        if (!empty($config['setting'])) {
            $server->set($config['setting']);
        }
    }
    return $server;
}

/**
 * 使用 AES-256 对数据进行加密
 * 需要事先配置好 encryption_key
 * 支持 string、array 与 object 类型的参数（对于 array 和 object 类型将会保留其键）
 *
 * @param mixed $data 需要加密的内容
 * @return mixed
 */
function encrypt($data)
{
    $CI = get_instance();
    static $start;
    if (!$start) {
        $CI->load->library('encryption');
        $CI->encryption->initialize(
            array(
                'cipher' => 'aes-256',
                'mode' => 'ctr',
            )
        );
        $start = TRUE;
    }
    if (is_array($data) || is_object($data)) {
        foreach ($data as $key => $item) {
            $value = encrypt($item);
            (is_array($data) && $data[$key] = $value) || (is_object($data) && $data->$key = $value);
        }
        return $data;
    } else {
        return $CI->encryption->encrypt($data);
    }
}

/**
 * 返回包含前缀的完整表名
 *
 * @param string $table_name 表名（不包含前缀）
 * @param string $db_key 指定数据库配置组（不指定则会使用默认）
 * @return string
 */
function table_name($table_name,$db_key = '')
{
    if (empty($db_key)) {
        $db_key = config_item('default_db');
    }
    $config = \Swoole::getInstance()->config['db'][$db_key];
    if (!empty($config['dbprefix'])) {
        $table_name = $config['dbprefix'] . $table_name;
    }
    return $table_name;
}

/**
 * 对使用 encrypt() 方法加密的数据进行解密
 * 需要事先配置好 encryption_key
 * 支持 string、array 与 object 类型的参数
 *
 * @param mixed $data 需要解密的内容
 * @return mixed
 */
function decrypt($data)
{
    $CI = get_instance();
    static $start;
    if (!$start) {
        $CI->load->library('encryption');
        $CI->encryption->initialize(
            array(
                'cipher' => 'aes-256',
                'mode' => 'ctr',
            )
        );
        $start = TRUE;
    }
    if (is_array($data) || is_object($data)) {
        foreach ($data as $key => $item) {
            $value = decrypt($item);
            (is_array($data) && $data[$key] = $value) || (is_object($data) && $data->$key = $value);
        }
        return $data;
    } else {
        return $CI->encryption->decrypt($data);
    }
}